import store from './store'// 通过它拿到token
import router from './router'
import { asyncRoutes } from '@/router'// 导入动态路由
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式
const whiteList = ['/login', '/404']
// 在外面获取token只能加载一次，不能实时获取
// 进入页面之前执行
// 当beforeEach中执行了重定向，就不会执行afterEach,所以要在重定向之后手动调用
router.beforeEach(async(to, from, next) => {
  // to去哪里  from从哪来   next 放行或者重定向
  NProgress.start()
  const token = store.getters.token
  if (token) {
  // 有token逻辑
    console.log(to.path, '5555')
    if (to.path === '/login') {
      next({ path: '/' })// 重定向
      NProgress.done()
    } else {
      const userInfo = store.state.user.userInfo
      // userInfo对象是空对象才执行用户信息的加载
      if (Object.keys(userInfo).length <= 0) {
        const res = await store.dispatch('user/userInfo')
        console.log(res.roles.menus, '将来控制权限')// 打印出和动态路由对应的权限名称
        console.log(res, '将来控制权限')// 打印出和动态路由对应的权限名称

        // 在这进行权限判断
        // 通过addRoutes方法添加所有路由
        // 维护路由的目的为了跳转
        // includes() 方法用来判断一个数组是否包含一个指定的值，根据情况，如果包含则返回 true，否则返回 false。
        // item.children[0].name拿到
        // filter如果正确就会添加到这个数组里面
        // filter返回一个数组
        // includes判断里面每一项的name是否和res.roles.menus里面的名字相配，如果一样返回true添加到数组里面
        const otherRouters = asyncRoutes.filter(item => res.roles.menus.includes(item.children[0].name))
        // router.addRoutes(asyncRoutes)
        console.log(asyncRoutes, '777')// 在这里面可以拿到item.children[0].name
        router.addRoutes([...otherRouters, { path: '*', redirect: '/404', hidden: true }])
        // 为了渲染
        store.commit('permission/setRoutes', otherRouters)
        // 确保addRoutes执行完毕之后
        next({ ...to, replace: true })
        return
      }
      next()
    }
  } else {
    // 如果whiteList里面有to.path这个元素，说明在白名单页面，那么就放行，否则就重新登录
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')// 重定向
      // 在重定向的位置手动加
      NProgress.done()
    }
  }
})
// 进入页面之后执行
router.afterEach((to, from) => {
  NProgress.done()
})
